package com.gzxt.agricultural.service;

import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import com.gzxt.agricultural.bo.User;
import com.gzxt.agricultural.exception.AgriculturalException;
import com.gzxt.agricultural.mapper.UserMapper;
import com.gzxt.agricultural.utils.Md5Utils;
import com.gzxt.agricultural.utils.WeBASEUtils;
import com.gzxt.agricultural.vo.Result;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.List;

@Service
public class UserServiceImpl implements UserService {
    @Value("${system.contract.producer_address}")
    private String producer_address;
    @Value("${system.contract.distributor_address}")
    private String distributor_address;
    @Value("${system.contract.retailer_address}")
    private String retailer_address;
    @Autowired
    private WeBASEUtils weBASEUtils;

    @Autowired
    private UserMapper userMapper;

    @Override
    public Result register(User user) {
        //当走到这里的时候 代表数据已经非空
        user.setAddress(user.getCorporateaddress());
        List funcParam = new ArrayList();
        funcParam.add(user.getAddress());
        String address = producer_address;
        String funcName = "addProducer";
        if (user.getRole() == 2) {
            address = distributor_address;
            funcName = "addDistributor";
        } else if (user.getRole() == 3) {
            address = retailer_address;
            funcName = "addRetailer";
        }


        //1.把调用者的地址改掉 2.函数名称
        String result = weBASEUtils.funcPost(address, funcName, funcParam);
        System.out.println("============>"+result);
        //2.根据返回结果集判断是否要存入数据库中 不存入数据库中 就抛出异常
        JSONObject jsonObject = JSONUtil.parseObj(result);
        if (!jsonObject.containsKey("statusOK") || !jsonObject.get("statusOK").equals(true)) {
            throw new AgriculturalException("注册用户失败，上链失败了");
        }
        //3.才能把数据存入到数据库中 是否需要加密处理 以及补充数据mybatis
        //4.补充数据和把密码进行加密操作
        user.setState(1);
        user.setPassword(Md5Utils.md5(user.getPassword()));
        //5.这里有两种写法
        //1.页面传入公司的地址(区块链上面的地址) 2.使用WeBASE-Fornt里面的接口 来创建账号 得到区块链地址 在把他传入到这个里面去

        user.setAddress(user.getCorporateaddress());
        int i = userMapper.register(user);
        if (i == 0) {
            //抛出异常
            throw new AgriculturalException("注册用户失败，插入数据库失败");
        }
        return Result.success("添加成功");
    }
}

